package com.kexio.dynamic.permission.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 权限规则注解
 * 
 * 用于定义复杂的权限验证规则
 * 
 * 使用示例：
 * <pre>
 * &#64;PermissionRule(
 *     name = "数据所有者权限",
 *     expression = "#{data.ownerId == user.id}",
 *     description = "只能访问自己拥有的数据"
 * )
 * &#64;DynamicPermission(resource = "data", action = "read")
 * public Data getData(Long dataId) {
 *     // 复杂权限规则验证
 * }
 * 
 * &#64;PermissionRule(
 *     name = "时间段权限",
 *     expression = "user.isAdmin() || (time.hour >= 9 && time.hour <= 18)",
 *     priority = 1
 * )
 * public void sensitiveOperation() {
 *     // 工作时间或管理员才能执行
 * }
 * </pre>
 * 
 * @author Kexio
 * @since 1.0.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionRule {

    /**
     * 规则名称
     */
    String name();

    /**
     * 规则表达式
     * 支持SpEL表达式、Groovy脚本等
     */
    String expression();

    /**
     * 规则类型
     */
    RuleType type() default RuleType.SPEL;

    /**
     * 规则优先级
     * 数字越小优先级越高
     */
    int priority() default 100;

    /**
     * 是否启用
     */
    boolean enabled() default true;

    /**
     * 规则描述
     */
    String description() default "";

    /**
     * 规则条件
     * 额外的验证条件
     */
    String condition() default "";

    /**
     * 规则参数
     * 传递给规则引擎的参数（JSON格式）
     */
    String parameters() default "";

    /**
     * 规则分组
     */
    String group() default "";

    /**
     * 是否缓存规则结果
     */
    boolean cached() default true;

    /**
     * 缓存过期时间（秒）
     */
    int cacheTimeout() default 600;

    /**
     * 规则生效时间（cron表达式）
     */
    String effectiveTime() default "";

    /**
     * 规则失效时间（cron表达式）
     */
    String expireTime() default "";

    /**
     * 规则标签
     */
    String[] tags() default {};

    /**
     * 是否记录规则执行日志
     */
    boolean logExecution() default false;

    /**
     * 规则验证失败时的消息
     */
    String failureMessage() default "权限验证失败";

    /**
     * 规则类型枚举
     */
    enum RuleType {
        /**
         * SpEL表达式
         */
        SPEL,
        
        /**
         * Groovy脚本
         */
        GROOVY,
        
        /**
         * JavaScript脚本
         */
        JAVASCRIPT,
        
        /**
         * 简单条件
         */
        SIMPLE,
        
        /**
         * 复合规则
         */
        COMPOSITE,
        
        /**
         * 自定义规则
         */
        CUSTOM
    }
}
